<?php
// {{{ is_required
/**
 *  グローバルユーティリティ関数: 指定されたフォーム項目が必須かどうかを返す
 *
 *  @param  string  $name   フォーム項目名
 *  @return bool    true:エラー有り false:エラー無し
 */
function is_required($name = null)
{
	
    $c =& Ethna_Controller::getInstance();
    $action_form =& $c->getActionForm();
    if ($name === null) {
        return false ;
    } else {
		$def = $action_form->getDef($name);
		$ret = isset($def['required']) ? $def['required'] : false;
        return $ret;
    }
}
// }}}



class ITT_Util
{
	/**
	 * @brief 典型的な配列
	 */

	var $month_array = array(1=>'1月',2=>'2月',3=>'3月',4=>'4月',5=>'5月',6=>'6月',7=>'7月',8=>'8月',9=>'9月',10=>'10月',11=>'11月',12=>'12月',);

	var $day_array = array(1=>'1日',2=>'2日',3=>'3日',4=>'4日',5=>'5日',6=>'6日',7=>'7日',8=>'8日',9=>'9日',10=>'10日',11=>'11日',12=>'12日',13=>'13日',14=>'14日',15=>'15日',16=>'16日',17=>'17日',18=>'18日',19=>'19日',20=>'20日',21=>'21日',22=>'22日',23=>'23日',24=>'24日',25=>'25日',26=>'26日',27=>'27日',28=>'28日',29=>'29日',30=>'30日',31=>'31日',);

	var $pref_array = array('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','山梨県','新潟県','長野県','富山県','石川県','福井県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県','海外') ;



	// エンコードを変換する
	function con_enc($value, $to_enc, $from_enc=_CHARSET){
		if(! function_exists('mb_convert_encoding')){
			return $value ;
		}
		if( is_array($value)){
			foreach($value as $key=>$var){
				$value[$key] = ITT_Util::con_enc($var, $to_enc, $from_enc) ;
			}
		}else{
			$value = mb_convert_encoding($value, $to_enc, $from_enc);
		}
		return $value ;
	}


	/// Flash特殊文字のエスケープ
	function escape_flash($str)
	{
		if( is_array($str)){
			foreach($str as $key=>$var){
				$str[$key] = ITT_Util::escape_flash($var);
			}
		}else{
			// main
			$escape_chars = array(
				'"','$',"\t","\n","\s","#","%","&","'","(",")","*","+","?",
				);
			foreach ($escape_chars as $e){
				$str = str_replace($e, urlencode($e), $str);
			}
		}
		return $str ;
	}

	/**
	 *	イメージファイルをアップロードする
	 *
	 *	@access	public
	 *  @param string フォーム名
	 *  @param boolean これがサムネイルかどうか。(サムネイルならtrue)
	 *  @param string アップロード先絶対パス
	 *  @param string サムネイル作成先絶対パス
	 *  @param int アップロードできる1ファイルあたりの最大サイズ(byte)
	 *  @param int アップロードできる1ファイルの最大幅(pixel)
	 *  @param int アップロードできる1ファイルの最大高(pixel)
	 *  @param array サムネイルの設定値
	 *  @param boolean そのままのファイル名を使うか、乱数生成するか
	 *  @param boolean Maxサイズにフィットさせるか
	 *  @param int 画像修正に使うソフト
	 *  @param array 許可するmime type
	 *  @param array 許可する拡張子
	 *	@return	array アップしたファイルの情報
	 */

	function uploadImageFiles($formname, $is_thumb, $upload_path, $thumb_path, $max_file_size, $max_file_width, $max_file_height,
							  $use_plainfilename=false, $fit_to_max=false, $image_resize_soft=1,
							  $allowed_mimetypes = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png'),
							  $allowed_exts = array('gif','jpeg','jpg','png')
							  ){

		// fit to myalbum-P_functions.php
		$GLOBALS['myalbum_width']  = $max_file_width ;
		$GLOBALS['myalbum_height'] = $max_file_height ;
		$GLOBALS['myalbum_imagingpipe'] = $image_resize_soft ;

		require_once dirname(__FILE__).'/myuploader.php';
		require_once dirname(__FILE__).'/myalbum-P_functions.php';

		if(!isset($_FILES[$formname])){
			return array() ;
		}else{
			$_files = $_FILES[$formname] ;
		}

		// ディレクトリ作成してみる
		$safe_mode = ini_get('safe_mode');
		if(@is_dir($upload_path) == false){
			if (!$safe_mode) {
				mkdir($upload_path, 0755);
			} else {
				exit($upload_path.'にFTPでログインしてディレクトリを作成してください');
			}
		}
		if(@is_dir($thumb_path) == false){
			if (!$safe_mode) {
				mkdir($thumb_path, 0755);
			} else {
				exit($thumb_path.'にFTPでログインしてディレクトリを作成してください');
			}
		}

		if ($is_thumb){
			// これがサムネイルならサムネイルパスにアップロード
			$upload_path = $thumb_path ;
		}
		if ($is_thumb || $fit_to_max){
			// サムネイルか、幅をセットするなら
			$max_file_width  = 10000000;
			$max_file_height = 10000000;
		}

		$uploader =& new MyXoopsMediaUploader(
			$upload_path ,
			$allowed_mimetypes,
			$max_file_size, $max_file_width, $max_file_height,
			$allowed_exts
			);

		$savedFile = array();
		for($i=0; $i<count($_FILES[$formname]['name']); $i++){
			if( $uploader->fetchMedia($formname , $i) ){
				// ファイル名と拡張子は自前でセット
				$targetext = preg_match('/\.[a-z]+$/',strtolower($_files['name'][$i]), $matchext) ? $matchext[0] : '' ;
				$targetname = $use_plainfilename ? substr($_files['name'][$i],0, strpos($_files['name'][$i], '.')) : md5($_files['name'][$i].time().rand()) ;
				$tmp_filename = $targetname.'_tmp'.$targetext ;
				$dst_filename = $targetname.$targetext ;
				$tmp_path = sprintf('%s/%s',$uploader->uploadDir,$tmp_filename);
				$dst_path = sprintf('%s/%s', $uploader->uploadDir,$dst_filename);
				$uploader->setTargetFileName($tmp_filename);
				$upload_result = $uploader->upload() ;
				if(!Ethna::isError($upload_result)){
					// fix_to_maxがあるなら、リサイズ。なければただのリネーム
					if ($fit_to_max){
						myalbum_modify_photo($tmp_path , $dst_path);
					} else {
						rename($tmp_path, $dst_path);
					}
					list($w,$h,$t) = getimagesize($dst_path) ;
					$uploaded_file = array(
						'filename' => $targetname ,
						'ext' => $targetext ,
						'res_x' => $w,
						'res_y' => $h,
						);
					$savedFile[] = $uploaded_file ;
				}else{
					$savedFile[] = Ethna::raiseError($uploader->getErrorMessage($upload_result->getCode()), $upload_result->getCode()) ;
				}
			}
		}
		return $savedFile ;
	}




	/* アップロードした画像のサムネイルを作ります。
	 * @param array アップロードしたファイルの情報
	 * @param array アップロードファイルのパス array('filename', 'ext', 'res_x', 'res_y')
	 * @param array 作成するサムネイルの値 array('size'=> ,'rule'=> , 'soft'=>);
	 *              ruleはw/h/b のどれか。softは0=>GD,1=>ImageMagick,2=>NetPBM
	 */
	function copy2Thumbnail(&$uploadfiles, $upload_path, $thumb_path,  $thumb_prop){
		//
		global $myalbum_makethumb , $myalbum_thumbsize , $myalbum_thumbrule ;
		$myalbum_makethumb = true ;

		$src_path = $upload_path ;

		foreach($uploadfiles as $key=>$file_prop){
			//			$thumb_path = sprintf('%s/thumbnail', $upload_path);
			$file_prop['ext'] = str_replace('.' , '' , $file_prop['ext']);
			$result = ITT_Util::createThumbnailImage($upload_path, $thumb_path, $file_prop, $thumb_prop, $thumb_prop['soft']);
			$uploadfiles[$key]['has_thumb'] = ($result==1) ? 1 : 0 ;
		}
	}



	/// @deplicated
	/* copy2Thumbnailから呼ばれることしか考えてないです
	 * サムネイルを作ってコピーする
	 * @param $path: サムネイルを置くパス
	 * @param $file_prop: 元画像のプロパティ array('filename'=>,'ext'=>,'res_x'=>,'res_y'=>);
	 * @param $thumb_prop: サムネイルの設定値
	 * @return boolean: 成功かどうか
	 */
	function createThumbnailImage($src_path, $thumb_path, $file_prop, $thumb_prop, $creator=0){
		// myalbum-Pのサムネイル関連ファイル読み込み
		require_once dirname(__FILE__).'/myalbum-P_functions.php';
		// myalbum-Pと同じような環境設定を仕掛ける
		global $myalbum_imagingpipe , $myalbum_makethumb , $myalbum_normal_exts ;
		$myalbum_imagingpipe = $creator ;
		!isset($myalbum_makethumb) and $myalbum_makethumb = 1 ;
		!isset($myalbum_normal_exts) and $myalbum_normal_exts = array( 'jpg' , 'jpeg' , 'gif' , 'png' ) ;

		global $myalbum_forcegd2 , $thumbs_dir ;
		!isset($myalbum_forcegd2) and  $myalbum_forcegd2 = true ;
		!isset($thumbs_dir) and $thumbs_dir = $thumb_path ;

		global $myalbum_thumbsize , $myalbum_thumbrule ;
		!isset($myalbum_thumbsize) and $myalbum_thumbsize = $thumb_prop['size'] ;
		!isset($myalbum_thumbrule) and $myalbum_thumbrule = $thumb_prop['rule'] ;


		$node = $file_prop['filename'];
		$ext = $file_prop['ext'] ;
		$src_path = $src_path. '/'. $file_prop['filename'].'.' . $file_prop['ext'] ;
		$res = myalbum_create_thumb( $src_path , $node , $ext ) ;
		return $res ;
	}



	// YYYYMMDDhhiiss形式で与えられた日付をunixtimeにする。
	function make_unixtime($yyyymmddhhiiss){
		// padding
		$yyyymmddhhiiss = sprintf('%-014s', $yyyymmddhhiiss);
		if(preg_match('/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/',$yyyymmddhhiiss, $match)){
			list($all, $y,$m,$d,$h,$i,$s) = $match ;
		}else{
			return 0 ;
		}
		$unixtime = mktime($h, $i, $s, $m, $d, $y);
		return $unixtime;
	}


	/**
	 * ディレクトリからディレクトリリストを得る
	 * @access public
	 * @return array
	 **/
	function getDirectoryList($dir, $only_dir=true){
		$ret = array();
		$dh = opendir($dir);
		if ($dh) {
			while (($file = readdir($dh)) !== false) {
				if($file != '.' && $file != '..'){
					if (!$only_dir || ($only_dir && is_dir($dir.'/'.$file))){
						$ret[] = $file ;
					}
				}
			}
		}
		closedir($dh);
		return $ret ;
	}





	/**
	 * 検索語句からAppSearchObjectのフィルタを作る
	 * 使い方:
	 *  このメソッドで得たEthna_AppSearchObject$soは、必ず空にならないフィールドをpidとすると
	 *  <code> $filter = array('pid' => $so) </code>
	 *  とすると使えます。
	 *
	 * @access public
	 * @param string searchword
	 * @param array field list
	 * @return object AppSearchObject
	 **/
	function getFilterbySearchWord($word, $field){
		$field = to_array($field);
		$word = preg_split("/\s/", str_replace('　', ' ', $word));
		$so =& new Ethna_AppSearchObject('', OBJECT_CONDITION_NE); // AND でつなぐので必ずO.Kのもの
		$w_so = null ;
		foreach($word as $w){
			if($w = trim($w)) {
				for($i=0; $i<count($field); $i++){
					if( is_null($w_so) ){
						$w_so = new Ethna_AppSearchObject($w, OBJECT_CONDITION_LIKE);
					}else{
						$w_so->addObject($field[$i], new Ethna_AppSearchObject($w, OBJECT_CONDITION_LIKE), OBJECT_CONDITION_OR);
					}
				}
				$so->addObject($field[0], $w_so, OBJECT_CONDITION_AND);
			}
			$w_so = null ;
		}

		// return
		if(isset($so)){
			return $so ;
		}else{
			return null;
		}
	}

	/**
	 * ページャを返す
	 * 使い方:
	 *  $ret['links']['all']でページリンクが取れます。詳しい設定はetc/***-ini.phpに記述
	 *
	 * @access public
	 * @param object Ethna_Config
	 * @param int total number of list
	 * @param int number of page
	 * @return array
	 **/
	function createPager($ethna_config, $total_num, $numperpage=false){
		$ret = array('data'=> array(), 'links'=>array());
		require_once 'Pager/Pager.php';
		if (strtolower(get_class($ethna_config)) != 'ethna_config' &&
			!is_subclass_of($ethna_config, 'Ethna_Config')){
			return $ret ;
		}
		$pageConfig = $ethna_config->get('pager');
		$pageConfig['totalItems'] = $total_num ;
		$pageConfig['perPage'] = $numperpage ? $numperpage : $pageConfig['perPage'] ;

		$pager = & Pager::factory($pageConfig);
		$ret['data']  = $pager->getPageData();
		$ret['links'] = $pager->getLinks();

		return $ret ;
	}


	/**
	 * @brief __FILE__からActionClass/ActionFormで使うclass名のアレを得る
	 * 使い方:
	 *  evalして動的にclassを定義したいときに
	function getClassBy__FILE__($__file__)
	{
		$_str = str_replace(BASE.'/app/action', '', $__file__);
		$_str = str_replace(BASE.'/app/view', '', $_str);
		return str_replace('/', '', $_str);
	}
	 */

	 function isMobileAgent()
	   {
		   $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';

		   $docomoRegex    = '^DoCoMo/\d\.\d[ /]';
		   $vodafoneRegex  = '^(?:(?:Vodafone|J-PHONE|SoftBank)/\d\.\d|MOT-)';
		   $ezwebRegex     = '^(?:KDDI-[A-Z]+\d+[A-Z]? )?UP\.Browser\/';
		   $mobileRegex =  "(?:($docomoRegex)|($vodafoneRegex)|($ezwebRegex))";

		   return preg_match("!$mobileRegex!", $ua, $matches) ;
	   }
}
?>